---@class BindableArray : LuaObject
---@field _datas any[]
---@field _events LuaAction[]
local this = BaseClass("BindableArray")

---增加一个数据
---@param item any 数据
---@param publish boolean 是否刷新
function this:Add(item, publish)
    table.insert(self._datas, item)

    if publish then
        self:Publish()
    end
end

---增加一组数据
---@param list any[] 数据
function this:AddRange(list)
    for key, value in pairs(list) do
        table.insert(self._datas, value)
    end
    self:Publish()
end

---删除一个数据
---@param item any 数据
---@param publish boolean 是否刷新
function this:Remove(item, publish)
    local idx = table.keyof(self._datas, item,-1)
    table.remove(self._datas, idx)

    if publish then
        self:Publish()
    end
end

---Subscribe:订阅
---@param luaAction LuaAction 回调方法
function this:Subscribe(luaAction)
    table.insert(self._events, luaAction)
end

---取消订阅
---@param luaAction LuaAction 回调方法
function this:Unsubscribe(luaAction)
    local idx = table.keyof(self._events, luaAction, -1)
    table.remove(self._events, idx)
end

---是否已经绑定过某个事件
---@param luaAction LuaAction 订阅的函数
---@return boolean
function this:IsSubscribe(luaAction)
    return table.contains(self._events, luaAction)
end

---发布订阅
function this:Publish()
    for key, value in pairs(self._events) do
        value(self._datas)
    end
end

---获取数据集合
---@return any[]
function this:GetDatas()
    return self._datas
end

---清空所有数据
function this:ClearData()
    table.clear(self._datas)
end

---清空所有订阅
function this:ClearEvent()
    table.clear(self._events)
end

---构造函数
function this:__ctor()
    self:ClearData()
    self:ClearEvent()
end

---析构函数
function this:__dtor()
    self._events = nil
    self._datas = nil
end

BindableArray = this